import axios from 'axios'
import qs from 'qs'
import { ACCESS_TOKEN } from '@/store/mutation-types'
import iziToast from 'izitoast'
import VueCookie from 'vue-cookie'
import router from '../router'
import store from '../store'

// 创建 axios 实例
const service = axios.create({
  baseURL: process.env.VUE_APP_API_BASE_URL, // api base_url
  timeout: 10000, // 请求超时时间
  retry: 3, // 超时重新请求次数
  retryInterval: 1000, // 请求间隙
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  }
})

// request 异常定义
const requestErr = (err) => {
  if (err.response) {
    switch (err.response.status) {
      case 401:
        // 删除 token 缓存
        VueCookie.delete(ACCESS_TOKEN)
        router.replace({
          path: '/login',
          query: { redirect: router.currentRoute.fullPath }// 登录成功后跳入浏览的当前页面
        })
        break
      case 500:
        console.log('请求异常' + err)
        break
    }
  }
  return Promise.reject(err)
}

// response 异常定义
const responseErr = (error) => {
  if (error.response) {
    const data = error.response.data
    // const accessToken = VueCookie.get(ACCESS_TOKEN);

    if (error.response.status === 401) {
      toLoginPage()
    }
    if (error.response.data.code === 500) {
      // 错误提示
      iziToast.error({ message: data.msg })
    }
  } else {
    // 权限异常提示
    iziToast.error({ message: '服务器异常' + error })
  }
  return Promise.reject(error)
}

// 全局请求拦截器
service.interceptors.request.use(
  config => {
    const access_token = VueCookie.get(ACCESS_TOKEN)

    if (config.url.indexOf('/login') > 0) {
      VueCookie.delete(ACCESS_TOKEN)
      store.commit('clearUserInfo')
      store.commit('setIsLogin', false)
    }

    if (access_token && config.method !== 'get') { // 判断是否存在token，如果存在的话，则每个http header都加上token
      config.headers['X-Access-Token'] = `bearer ` + access_token// 让每个请求携带自定义 accessToken 请根据实际情况自行修改
    }

    if (config.headers['Content-Type'] === 'application/x-www-form-urlencoded') {
      if (config.method === 'post') {
        if (!config._retryCount || config._retryCount === 0) {
          // 只处理第一次请求数据，保证后面请求超时请求数据正常
          config.data = qs.stringify({ ...config.data }) // 转为formdata数据格式
        }
      }
    }

    return config
  },
  requestErr
)

// 全局统一处理 response 拦截器
service.interceptors.response.use(
  response => {
    const res = response.data
    if (res.code === 401) {
      toLoginPage()
    } else {
      return res
    }
  }, responseErr)

// 跳转至登录
const toLoginPage = () => {
  VueCookie.delete(ACCESS_TOKEN)
  store.commit('clearMenuNavTab')
  router.push('/login')
}

export {
  service as axios
}
